return 0;
}
+void hap_p2m_init(struct p2m_domain *p2m)
+{
+ p2m->write_p2m_entry = hap_write_p2m_entry;
+}
+
static unsigned long hap_gva_to_gfn_real_mode(
struct vcpu *v, struct p2m_domain *p2m, unsigned long gva, uint32_t *pfec)
{
.p2m_ga_to_gfn = hap_p2m_ga_to_gfn_real_mode,
.update_cr3 = hap_update_cr3,
.update_paging_modes = hap_update_paging_modes,
- .write_p2m_entry = hap_write_p2m_entry,
.flush_tlb = flush_tlb,
.guest_levels = 1
};
.p2m_ga_to_gfn = hap_p2m_ga_to_gfn_2_levels,
.update_cr3 = hap_update_cr3,
.update_paging_modes = hap_update_paging_modes,
- .write_p2m_entry = hap_write_p2m_entry,
.flush_tlb = flush_tlb,
.guest_levels = 2
};
.p2m_ga_to_gfn = hap_p2m_ga_to_gfn_3_levels,
.update_cr3 = hap_update_cr3,
.update_paging_modes = hap_update_paging_modes,
- .write_p2m_entry = hap_write_p2m_entry,
.flush_tlb = flush_tlb,
.guest_levels = 3
};
.p2m_ga_to_gfn = hap_p2m_ga_to_gfn_4_levels,
.update_cr3 = hap_update_cr3,
.update_paging_modes = hap_update_paging_modes,
- .write_p2m_entry = hap_write_p2m_entry,
.flush_tlb = flush_tlb,
.guest_levels = 4
};
if ( v->domain != d )
v = d->vcpu ? d->vcpu[0] : NULL;
- if ( likely(v && paging_mode_enabled(d) && paging_get_hostmode(v)) )
- rc = paging_get_hostmode(v)->write_p2m_entry(p2m, gfn, p, new, level);
+ if ( likely(v && paging_mode_enabled(d) && paging_get_hostmode(v)) ||
+ p2m_is_nestedp2m(p2m) )
+ rc = p2m->write_p2m_entry(p2m, gfn, p, new, level);
else
safe_write_pte(p, new);
new_entry = l1e_from_mfn(mfn, P2M_BASE_FLAGS | _PAGE_RW);
- rc = p2m->write_p2m_entry(p2m, gfn, p2m_entry, new_entry, level + 1);
+ rc = write_p2m_entry(p2m, gfn, p2m_entry, new_entry, level + 1);
if ( rc )
goto error;
}
{
new_entry = l1e_from_pfn(pfn | (i << ((level - 1) * PAGETABLE_ORDER)),
flags);
- rc = p2m->write_p2m_entry(p2m, gfn, l1_entry + i, new_entry, level);
+ rc = write_p2m_entry(p2m, gfn, l1_entry + i, new_entry, level);
if ( rc )
{
unmap_domain_page(l1_entry);
unmap_domain_page(l1_entry);
new_entry = l1e_from_mfn(mfn, P2M_BASE_FLAGS | _PAGE_RW);
- rc = p2m->write_p2m_entry(p2m, gfn, p2m_entry, new_entry,
- level + 1);
+ rc = write_p2m_entry(p2m, gfn, p2m_entry, new_entry, level + 1);
if ( rc )
goto error;
}
if ( (l1e_get_flags(e) & _PAGE_PRESENT) && !needs_recalc(l1, e) )
{
set_recalc(l1, e);
- err = p2m->write_p2m_entry(p2m, first_gfn, pent, e, level);
+ err = write_p2m_entry(p2m, first_gfn, pent, e, level);
if ( err )
{
ASSERT_UNREACHABLE();
!needs_recalc(l1, ent) )
{
set_recalc(l1, ent);
- err = p2m->write_p2m_entry(p2m, gfn - remainder, &ptab[i],
- ent, level);
+ err = write_p2m_entry(p2m, gfn - remainder, &ptab[i], ent,
+ level);
if ( err )
{
ASSERT_UNREACHABLE();
if ( !err )
{
clear_recalc(l1, e);
- err = p2m->write_p2m_entry(p2m, gfn, pent, e, level + 1);
+ err = write_p2m_entry(p2m, gfn, pent, e, level + 1);
ASSERT(!err);
recalc_done = true;
}
else
clear_recalc(l1, e);
- err = p2m->write_p2m_entry(p2m, gfn, pent, e, level + 1);
+ err = write_p2m_entry(p2m, gfn, pent, e, level + 1);
ASSERT(!err);
recalc_done = true;
: l3e_empty();
entry_content.l1 = l3e_content.l3;
- rc = p2m->write_p2m_entry(p2m, gfn, p2m_entry, entry_content, 3);
+ rc = write_p2m_entry(p2m, gfn, p2m_entry, entry_content, 3);
/* NB: write_p2m_entry() handles tlb flushes properly */
if ( rc )
goto out;
entry_content = l1e_empty();
/* level 1 entry */
- rc = p2m->write_p2m_entry(p2m, gfn, p2m_entry, entry_content, 1);
+ rc = write_p2m_entry(p2m, gfn, p2m_entry, entry_content, 1);
/* NB: write_p2m_entry() handles tlb flushes properly */
if ( rc )
goto out;
: l2e_empty();
entry_content.l1 = l2e_content.l2;
- rc = p2m->write_p2m_entry(p2m, gfn, p2m_entry, entry_content, 2);
+ rc = write_p2m_entry(p2m, gfn, p2m_entry, entry_content, 2);
/* NB: write_p2m_entry() handles tlb flushes properly */
if ( rc )
goto out;
int rc;
set_recalc(l1, e);
- rc = p2m->write_p2m_entry(p2m, gfn, &tab[i], e, 4);
+ rc = write_p2m_entry(p2m, gfn, &tab[i], e, 4);
if ( rc )
{
ASSERT_UNREACHABLE();
p2m->recalc = do_recalc;
p2m->change_entry_type_global = p2m_pt_change_entry_type_global;
p2m->change_entry_type_range = p2m_pt_change_entry_type_range;
- p2m->write_p2m_entry = write_p2m_entry;
+
+ /* Still too early to use paging_mode_hap(). */
+ if ( hap_enabled(p2m->domain) )
+ hap_p2m_init(p2m);
+ else if ( IS_ENABLED(CONFIG_SHADOW_PAGING) )
+ shadow_p2m_init(p2m);
+
#if P2M_AUDIT
p2m->audit_p2m = p2m_pt_audit_p2m;
#else